home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume90 / kernel / xoper_22 / part03 / Xoper.a.ab
Text File  |  1990-02-01  |  53KB  |  2,501 lines

  1. signal        bsr     readhex
  2.         tst.b   d7
  3.         beq     syntax
  4. setthem     move.l  d0,savedat
  5.         bsr     nodenam
  6.         moveq.l #2,d7
  7.         lea     TReNode(PC),a4
  8.         bsr     findnam
  9.         tst.b   d7
  10.         beq.s   pi1
  11.         move.l  d0,a1
  12.         move.l  savedat,d0
  13.         and.l   18(a1),d0
  14.         CALL    Signal,_SysBase(PC)
  15.         rts
  16.  
  17. ;set up a list of tasknames which should't be displayed
  18.  
  19. hide        cmp.b   #10,0(a0)
  20.         bne.s   hid5
  21.         bra     syntax
  22. hid5        lea     hidestart(PC),a2
  23.         move.l  a2,d3
  24. hid0        tst.l   0(a2)
  25.         beq.s   hid1
  26.         move.l  0(a2),a2
  27.         lea     4(a2),a1
  28.         bsr     strcmp
  29.         tst     d0
  30.         beq.s   hid2
  31.         move.l  a2,d3
  32.         bra.s   hid0
  33. hid1        move.l  a0,a4
  34.         bsr     strlen2
  35.         addq    #5,d0
  36.         move.l  #65536,d1
  37.         CALL    AllocMem,_SysBase(PC)
  38.         tst.l   d0
  39.         beq.s   hid4
  40.         move.l  d0,a1
  41.         move.l  d0,0(a2)
  42.         addq    #4,a1
  43. hid3        cmp.b   #10,0(a4)
  44.         beq.s   hid4
  45.         move.b  (a4)+,(a1)+
  46.         bra.s   hid3
  47. hid4        rts
  48. hid2        move.l  d3,a3
  49.         move.l  0(a2),0(a3)
  50. freehidden  lea     4(a2),a0
  51.         bsr     strlen
  52.         addq    #5,d0
  53.         move.l  a2,a1
  54.         CALL    FreeMem,_SysBase(PC)
  55.         rts
  56.  
  57. freehidmem  move.l  hidestart(PC),a4
  58. fhm0        move.l  a4,d0
  59.         beq.s   fhm1
  60.         move.l  a4,a2
  61.         move.l  0(a2),a4
  62.         bsr     freehidden
  63.         bra     fhm0
  64. fhm1        rts
  65.  
  66. ;set up an ALIAS list
  67. alias        cmp.b   #10,0(a0)
  68.         beq     showalias
  69.         bsr     strbuf
  70.         move.l  a0,a5
  71.         lea     buffer,a0
  72.         bsr     strlen
  73.         tst.l   d0
  74.         beq     syntax
  75.  
  76.         moveq   #1,d1
  77.         cmp     d1,d0
  78.         bne.s   5$
  79.         lea     params(PC),a0
  80.         moveq   #parmnum-1,d1
  81.         move.b  buffer,d2
  82. 6$        cmp.b   (a0)+,d2
  83.         dbeq    d1,6$
  84.         tst.w   d1
  85.         bmi.s   5$
  86.         move.l  #aliaserr,d0
  87.         bsr     putstr
  88.         move.l  #params,d0
  89.         bsr     putstr
  90.         move.l  #aliaserr2,d0
  91.         bra     putnam
  92.  
  93. 5$        move.l  d0,d5
  94.         move.l  a5,a0
  95.         adda.l  d0,a0
  96.         bsr     kllblnks
  97.         move.l  a5,-(a7)
  98.         bsr     findcmd
  99.         move.l  (a7)+,a5
  100.         tst.l   d2
  101.         bmi     syntax
  102.         move.l  a5,a0
  103.         bsr     strbuf
  104.  
  105.         addq    #6,d5
  106.         move.l  d5,d0
  107.         move.l  #65536,d1
  108.         CALL    AllocMem,_SysBase(PC)
  109.         tst.l   d0
  110.         beq.s   1$
  111.  
  112.         move.l  aliaslist(PC),d1
  113.         bne.s   2$
  114.         move.l  d0,aliaslist
  115.         bra.s   3$
  116. 2$        move.l  d1,a0
  117.         move.l  0(a0),d1
  118.         bne.s   2$
  119.         move.l  d0,0(a0)
  120.  
  121. 3$        move.l  d0,a0
  122.         move.b  d2,4(a0)
  123.  
  124.         lea     5(a0),a0
  125.         lea     buffer,a1
  126. 4$        move.b  (a1)+,(a0)+
  127.         bne.s   4$
  128. 1$        rts
  129.  
  130. showalias   lea     alhead(PC),a0
  131.         bsr     puthead
  132.         move.l  aliaslist(PC),d0
  133.         beq.s   1$
  134. 2$        move.l  d0,a5
  135.         addq    #5,d0
  136.         bsr     putstr
  137.         move.w  #15,d1
  138.         bsr     tab
  139.         move.l  #equal,d0
  140.         bsr     putstr
  141.         move.b  4(a5),d0
  142.         ext.w   d0
  143.         bsr     getcmdptr
  144.         bsr     putnam
  145.         move.l  0(a5),d0
  146.         bne.s   2$
  147. 1$        rts
  148.  
  149. freealias   move.l  aliaslist(PC),a4
  150. 1$        move.l  a4,d0
  151.         beq.s   2$
  152.         move.l  a4,a2
  153.         move.l  0(a2),a4
  154.         lea     5(a2),a0
  155.         bsr     strlen
  156.         addq    #6,d0
  157.         move.l  a2,a1
  158.         CALL    FreeMem,_SysBase(PC)
  159.         bra     1$
  160. 2$        rts
  161.  
  162. getcmdptr   move.l  a0,-(a7)
  163.         lea     commds(PC),a0
  164. 2$        tst     d0
  165.         beq.s   1$
  166. 3$        tst.b   (a0)+
  167.         bne.s   3$
  168.         subq    #1,d0
  169.         bra.s   2$
  170. 1$        move.l  a0,d0
  171.         move.l  (a7)+,a0
  172.         rts
  173.  
  174.  
  175. ;'flushlibs'
  176. flush        move.l  #$ffffff,d0
  177.         moveq   #0,d1
  178.         CALL    AllocMem,_SysBase(PC)
  179. flsh1        rts
  180.  
  181. ;display library->lib_IDString
  182. info        bsr     nodenam2
  183.         moveq.l #2,d7
  184.         lea     DevNode(PC),a4
  185.         bsr     findnam
  186.         tst.b   d7
  187.         beq.s   flsh1
  188.         move.l  d0,a0
  189.         move.l  24(a0),d0
  190.         beq.s   if1
  191.         move.l  d0,d1
  192.         andi.l  #1,d1
  193.         bne.s   if1
  194.         bra     putnam
  195. if1        move.l  #noinfo,d0
  196.         bsr     putstr
  197.         move.l  a5,d0
  198.         bra     putnam
  199.  
  200. capture     move.l  _SysBase(PC),a1
  201.         lea     42(a1),a0
  202.         moveq   #2,d6
  203.         lea     coldtxt,a4
  204. cap0        move.l  a4,d0
  205.         bsr     putstr
  206.         move.l  0(a0),d0
  207.         bne.s   cap1
  208.         move.l  #unset,d0
  209.         bsr     putstr
  210.         bra     cap2
  211. cap1        bsr     hexa
  212. cap2        bsr     newline
  213.         lea     15(a4),a4
  214.         addq    #4,a0
  215.         dbf     d6,cap0
  216.  
  217.         move.l  #kicktxt,d0
  218.         bsr     putstr
  219.         move.l  546(a1),a0
  220.         cmpa.l  #0,a0
  221.         bne.s   kickm3
  222.         move.l  #unset,d0
  223.         bra     putnam
  224. kickm3        move.l  a0,-(a7)
  225.         bsr     newline
  226.         lea     kickhead(PC),a0
  227.         bsr     puthead
  228.         move.l  (a7)+,a0
  229. kickm0        move.l  a0,d0
  230.         beq     kickm4
  231.         bpl.s   kickm1
  232.         bclr    #31,d0
  233.         move.l  d0,a0
  234.         bra.s   kickm0
  235. kickm1        move.w  14(a0),d6
  236.         subq    #1,d6
  237.         lea     16(a0),a2
  238. kickm2        move.l  0(a2),d0
  239.         bsr     hexa
  240.         move.l  0(a2),d0
  241.         move.l  4(a2),d4
  242.         add.l   d4,d0
  243.         bsr     hexa
  244.         move.l  d4,d0
  245.         clr.b   d3
  246.         bsr     longdec
  247.         bsr     newline
  248.         addq    #8,a2
  249.         dbf     d6,kickm2
  250.         move.l  0(a0),a0
  251.         bra     kickm0
  252. kickm4        rts
  253.  
  254. clrcold     move.l  _SysBase,a0
  255.         clr.l   42(a0)
  256.         bra.s   chksum
  257. clrcool     move.l  _SysBase,a0
  258.         clr.l   46(a0)
  259.         bra.s   chksum
  260. clrwarm     move.l  _SysBase,a0
  261.         clr.l   50(a0)
  262.  
  263. chksum        lea     34(a0),a1
  264.         move    #22,d0
  265. addchk        add     (a1)+,d1
  266.         dbf     d0,addchk
  267.         not     d1
  268.         move.w  d1,82(a0)
  269.         rts
  270.  
  271. ;Save the command line to be repeated. If this line doesn't produce
  272. ;any output, don't repeat it at all
  273. repeatcmd   tst.w   repeat
  274.         bne.s   2$
  275.         move.w  repeatlen(PC),d0
  276.         subq    #7,d0
  277.         move.w  d0,repeatlen
  278.         lea     repeatbuffer,a1
  279.         lea     dummy,a2
  280.         move.w  d0,d1
  281.         ext.l   d1
  282. 1$        move.b  0(a0),(a1)+
  283.         move.b  (a0)+,(a2)+
  284.         dbf     d1,1$
  285.  
  286.         clr.l   lastprinted
  287.         clr.b   printed
  288.         move.w  #1,repeat
  289.         bsr     cli
  290.         tst.b   printed
  291.         beq.s   2$
  292.         bsr     starttimer
  293.         rts
  294. 2$        clr.w   repeat
  295.         rts
  296.  
  297. ;save the parameters from a 'window x y width height' call
  298. setwindow   tst.b   fromfile
  299.         bne.s   wiw1
  300. wiw3        move.l  #wiwerr,d0
  301.         bra     putnam
  302. wiw1        lea     window_l(PC),a3
  303.         moveq   #3,d5
  304. wiw0        bsr     getnum
  305.         tst     d7
  306.         beq.s   wiw2
  307.         move.w  d2,0(a3)
  308.         addq    #2,a3
  309.         dbf     d5,wiw0
  310. wiw2        rts
  311.  
  312. ;display ExecBase->LastAlert
  313. lastalert   movem.l $100,d1-d2
  314.         tst.l   d1
  315.         bne.s   al1
  316.         move.l  _SysBase(PC),a0
  317.         movem.l 514(a0),d1-d2
  318. al1        move.l  #gurutxt,d0
  319.         bsr     putstr
  320.         move.l  d1,d0
  321.         bsr     hexa
  322.         lea     out,a0
  323.         move.l  ptr(PC),d0
  324.         move.b  #'.',-1(a0,d0)
  325.         move.l  d2,d0
  326.         bsr     hexa
  327.         bra     newline
  328.  
  329. ;toggle CLI-Commands
  330. clicmd        bchg    #0,cmdcli
  331.         rts
  332.  
  333. ;toggle CPUSE task list
  334. usage        bchg    #0,usageflag
  335.         rts
  336.  
  337. ;toggle task-header display on/off
  338. nohead        bchg    #0,headon
  339.         rts
  340.  
  341. ;toggle hide entries on/off
  342. hidden        bchg    #0,hideon
  343.         rts
  344.  
  345. ;toggle sort on/off
  346. sort       bchg    #0,sorton
  347.        rts
  348.  
  349. ;toggle task-ports display on/off
  350. taskports   bchg    #0,tports
  351. clo1        rts
  352.  
  353. ;Open a library
  354. openlib     bsr     nodenam2
  355.         move.l  a5,a1
  356.         moveq   #0,d0
  357.         CALL    OpenLibrary,_SysBase(PC)
  358.         tst.l   d0
  359.         beq     fn5
  360. opli1        rts
  361.  
  362.  
  363. ;close it
  364. closelib    bsr     nodenam2
  365.         moveq   #0,d7
  366.         lea     LibNode(PC),a4
  367.         bsr     findnam
  368.         tst.b   d7
  369.         beq.s   clo1
  370.         move.l  d0,a1
  371.         CALL    CloseLibrary,_SysBase(PC)
  372.         rts
  373.  
  374. remnode     bsr     nodenam2
  375.         moveq   #7,d7
  376.         lea     TReNode(PC),a4
  377.         bsr     findnam
  378.         tst.b   d7
  379.         beq.s   1$
  380.         CALL    Disable,_SysBase(PC)
  381.         move.l  d0,a1
  382.         CALL    Remove,_SysBase(PC)
  383.         CALL    Enable,_SysBase(PC)
  384. 1$        rts
  385.  
  386. ;end Xoper but stay in background
  387. quithold    lea     in,a0
  388.         lea     dummy,a1
  389. qh1        move.b  (a1)+,d0
  390.         move.b  d0,(a0)+
  391.         cmp.b   #10,d0
  392.         bne.s   qh1
  393.  
  394. instback    tst.b   background
  395.         bne.s   cleanit
  396.         move.b  #1,background
  397.         bsr     installh
  398. cleanit     move.l  infile(PC),d1
  399.         beq.s   ib1
  400.         CALL    Close,dosbase(PC)
  401.         clr.l   infile
  402.         clr.b   fromfile
  403. ib1        clr.b   running
  404.         bsr     killpage
  405.         bsr     freeblank
  406.         tst.l   wnptr
  407.         beq.s   5$
  408.         tst.b   ownscreen
  409.         bne.s   6$
  410.         move.l  wnptr(PC),a0
  411.         move.l  4(a0),window_l
  412.         move.l  8(a0),window_w
  413. 6$        move.l  wnptr(PC),a0
  414.         CALL    CloseWindow,intuibase(PC)
  415.         clr.l   intuimsg
  416.         clr.l   wnptr
  417. 5$        move.l  screenptr(PC),d0
  418.         beq.s   4$
  419.         move.l  d0,a0
  420.         CALL    CloseScreen,intuibase(PC)
  421.         clr.l   screenptr
  422.  
  423.         move.l  realstack(PC),a7
  424.  
  425. 4$        tst.b   iconifyon
  426.         beq.s   1$
  427.         jsr     iconify
  428.         bra.s   2$
  429.  
  430. 1$        move.l  mysignal(PC),d0
  431.         or.l    trapsignal(PC),d0
  432.         CALL    Wait,_SysBase(PC)
  433. 2$        move.b  #1,running
  434.         and.l   trapsignal(PC),d0
  435.         beq.s   3$
  436.         move.b  #1,gotguru
  437. 3$        bra     restart
  438.  
  439. ;fill all unused memory-chunks with a longword
  440. clear        moveq   #0,d0
  441.         cmp.b   #10,0(a0)
  442.         beq.s   clr5
  443.         bsr     readhex
  444.         tst.b   d7
  445.         beq     syntax
  446. clr5        move.l  _SysBase(PC),a0
  447.         clr.l   parmtxt
  448.         lea     322(a0),a0
  449.         move.w  #$4000,$dff09a
  450. clr1        move.l  0(a0),a0
  451.         tst.l   0(a0)
  452.         beq.s   clr6
  453.         move.l  16(a0),a1
  454. clr2        tst.l   0(a1)
  455.         beq.s   clr1
  456.         addq.l  #1,parmtxt
  457.         move.l  4(a1),d1
  458.         subq.l  #8,d1
  459.         ble.s   clr31
  460.         lsr.l   #2,d1
  461.         subq.l  #1,d1
  462.         bmi.s   clr31
  463.         lea     8(a1),a2
  464. clr3        move.l  d0,(a2)+
  465.         dbf     d1,clr3
  466. clr31        move.l  0(a1),a1
  467.         bra.s   clr2
  468. clr6        move.w  #-$4000,$dff09a
  469.         move.l  parmtxt(PC),d0
  470.         bsr     longdec
  471.         move.l  #clrtxt,d0
  472.         bra     putnam
  473.  
  474. ;change the number of maximum lines in the history buffer
  475. historylines
  476.         bsr     getnum
  477.         tst.b   d7
  478.         beq     syntax
  479.         move.w  d2,maxhlines
  480.         move.w  hnum(PC),d0
  481. 1$        cmp.w   maxhlines(PC),d0
  482.         ble.s   2$
  483.         bsr     remhistline
  484.         subq    #1,d0
  485.         bra.s   1$
  486. 2$        move.l  history+8,curhist
  487.         move.w  d0,hnum
  488.         rts
  489. ;set the minimum number of characters a input line
  490. ;must have to be added to the history buffer
  491. historylength
  492.         bsr     getnum
  493.         tst.b   d7
  494.         beq     syntax
  495.         tst.b   d2
  496.         bne.s   1$
  497.         addq    #1,d2
  498. 1$        move.w  d2,minnumchars
  499.         rts
  500. ;display all lines in the history buffer
  501. showhistory move.l  history(PC),a5
  502.         moveq   #1,d5
  503. 1$        tst.l   0(a5)
  504.         beq.s   2$
  505.         move.l  d5,d3
  506.         bsr     bytedec
  507.         move.w  8(a5),d0
  508.         ext.l   d0
  509.         lea     10(a5),a0
  510.         lea     inputbuffer,a1
  511.         CALL    CopyMem,_SysBase(PC)
  512.         move.w  8(a5),d0
  513.         lea     inputbuffer,a1
  514.         clr.b   0(a1,d0.w)
  515.         move.l  a1,d0
  516.         bsr     putnam
  517.         addq    #1,d5
  518.         move.l  0(a5),a5
  519.         bra.s   1$
  520. 2$        rts
  521.  
  522. ;set the maximum lines the output buffer may hold
  523. outputlines bsr     getnum
  524.         tst.b   d7
  525.         beq     syntax
  526.         moveq   #100,d3
  527.         tst.l   d2
  528.         bmi.s   2$
  529.         cmp.l   d3,d2
  530.         bge.s   1$
  531. 2$        move.l  d3,d2
  532. 1$        move.l  d2,maxlines
  533.         rts
  534.  
  535. ;find a named node
  536. ;d7 = number of lists to search through
  537. ;a4 = pointer to the first entry in the
  538. ;     list-offset-table
  539. ;a5 = pointer to name
  540. ;returns:
  541. ;d7 = TRUE/FALSE 1/0
  542. ;d0 = node
  543.  
  544. findnam     tst.b   0(a5)
  545.         bne.s   1$
  546.         move.l  #nameerr,d0
  547.         bsr     putnam
  548.         bra     fnerr
  549. 1$        cmp.b   #'$',0(a5)
  550.         bne.s   fn2
  551.         move.l  d7,d2
  552.         move.l  a5,a0
  553.         bsr     readhex
  554.         tst.b   d7
  555.         beq.s   fn6
  556.         move.l  d2,d7
  557.         bsr     tstnode
  558.         tst.l   d5
  559.         bne.s   fn3
  560.         bra     fn5
  561. fn6        move.l  d2,d7
  562. fn2        move.l  _SysBase(PC),a0
  563.         adda.l  0(a4),a0
  564.         move.l  a5,a1
  565. fn4        CALL    FindName,_SysBase(PC)
  566.         tst.l   d0
  567.         bne.s   fn1
  568.         addq    #4,a4
  569.         dbf     d7,fn2
  570. fn5        move.l  #namerr,d0
  571.         bsr     putstr
  572.         move.l  a5,d0
  573.         bsr     putnam
  574. fnerr        clr.b   d7
  575.         rts
  576. fn1        move.b  procnum(PC),d2
  577.         beq.s   fn3
  578.         move.l  d0,a0
  579.         cmp.b   143(a0),d2
  580.         bne.s   fn4
  581. fn3        moveq.l #1,d7
  582.         rts
  583.  
  584. ;list-offset-table
  585. TRuNode     dc.l    276
  586. TReNode     dc.l    406
  587. TWaNode     dc.l    420
  588. DevNode     dc.l    350
  589. LibNode     dc.l    378
  590. ResNode     dc.l    336
  591. MemNode     dc.l    322
  592. PorNode     dc.l    392
  593. SemNode     dc.l    532
  594.  
  595. ;Node has been entered in hex. Check if this node exsists
  596. tstnode     tst.b   fromfile
  597.         bne.s   illegalhex
  598.         move.l  d0,d1
  599.         btst    #0,d1
  600.         beq.s   inrange
  601.         move.l  #adrerr,d0
  602.         bsr     putnam
  603. illegalhex  moveq   #0,d5
  604.         rts
  605. inrange     movem.l d7/a4,-(a7)
  606.         cmp.l   #TRuNode,a4
  607.         bne.s   inrange1
  608.         move.l  _SysBase(PC),a0
  609.         cmp.l   276(a0),d0
  610.         beq.s   nodefound
  611.         subq    #1,d7
  612.         addq    #4,a4
  613. inrange1    move.w  #$4000,$dff09a
  614. getlist     move.l  _SysBase(PC),a0
  615.         add.l   0(a4),a0
  616. nxtnode     tst.l   0(a0)
  617.         beq.s   nxtlist
  618.         cmp.l   a0,d0
  619.         beq.s   nodefound
  620.         move.l  0(a0),a0
  621.         bra.s   nxtnode
  622. nxtlist     addq    #4,a4
  623.         dbf     d7,getlist
  624.         move.w  #-$4000,$dff09a
  625.         movem.l d0/d7/a4,-(a7)
  626.         bsr     ResumeOutput
  627.         move.l  #noderr,d0
  628.         bsr     putnam
  629.         bsr     readline
  630.         movem.l (a7)+,d0/d7/a4
  631.         cmp.b   #'y',inputbuffer
  632.         beq.s   nodefound1
  633.         moveq   #0,d5
  634.         movem.l (a7)+,d7/a4
  635.         rts
  636. nodefound   move.w  #-$4000,$dff09a
  637. nodefound1  move.b  #1,d5
  638. etst        movem.l (a7)+,d7/a0
  639.         rts
  640.  
  641. ;allocate FileInfoBlock
  642. allocfinfo  move.l  #260,d0
  643.         moveq   #0,d1
  644.         CALL    AllocMem,_SysBase(PC)
  645.         move.l  d0,finfoptr
  646.         rts
  647.  
  648. ;free FileInfoBlock
  649. freefinfo   move.l  #260,d0
  650.         move.l  finfoptr(PC),d1
  651.         beq.s   1$
  652.         move.l  d1,a1
  653.         CALL    FreeMem,_SysBase(PC)
  654. 1$        rts
  655.  
  656. ;Examine ,d0=Lock
  657. getfinfo    move.l  d0,d1
  658.         move.l  finfoptr,d2
  659.         CALL    Examine,dosbase(PC)
  660.         rts
  661.  
  662. ;construct a Pathname from a lock
  663. ;d0=Lock ,resulting string is written to window
  664. getpath     movem.l d1-d7/a0-a6,-(a7)
  665.         move.l  d0,d1
  666.         beq.s   1$
  667.         CALL    DupLock,dosbase(PC)
  668. 1$        lea     out,a4
  669.         clr.b   -(a4)
  670. gp0        move.l  d0,-(a7)
  671.         bsr     getfinfo
  672.         move.l  finfoptr,a0
  673.         move.l  4(a0),d4
  674.         addq    #8,a0
  675.         bsr     strlen
  676.         lea     -1(a4),a5
  677.         tst.l   d4
  678.         bmi.s   nodir
  679.         move.b  #'/',-(a4)
  680. nodir        subq    #1,d0
  681.         bmi.s   nofnam
  682. gp1        move.b  0(a0,d0),-(a4)
  683.         dbf     d0,gp1
  684. nofnam        move.l  0(a7),d1
  685.         CALL    ParentDir,dosbase(PC)
  686.         move.l  d0,d4
  687.         move.l  (a7)+,d1
  688.         beq.s   2$
  689.         CALL    UnLock,dosbase(PC)
  690. 2$        move.l  d4,d0
  691.         bne     gp0
  692. putall        cmp.b   #'/',0(a5)
  693.         bne.s   gp2
  694.         move.b  #':',0(a5)
  695. gp2        move.l  a4,d0
  696.         bsr     putnam
  697.         movem.l (a7)+,d1-d7/a0-a6
  698.         rts
  699. strlen        move.l  a0,-(a7)
  700.         moveq   #-1,d0
  701. strl2        addq.l  #1,d0
  702.         tst.b   (a0)+
  703.         bne.s   strl2
  704.         move.l  (a7)+,a0
  705.         rts
  706. strlen2     move.l  a0,-(a7)
  707.         move.l  #-1,d0
  708. strl22        addq.l  #1,d0
  709.         cmp.b   #10,(a0)+
  710.         bne.s   strl22
  711.         move.l  (a7)+,a0
  712.         rts
  713.  
  714. ;write a title and underline
  715. ;a0 = pointer to text
  716. puthead1    bsr     strlen
  717.         move.l  d0,d5
  718.         move.l  a0,d0
  719.         bra     putstr
  720.  
  721. puthead2    bsr     strlen
  722.         add.l   d0,d5
  723.         bra.s   ph2
  724.  
  725. puthead     bsr     strlen
  726.         move.l  d0,d5
  727. ph2        move.l  a0,d0
  728.         bsr     putnam
  729.         lea     out,a0
  730.         move.l  a0,d0
  731. ph1        move.b  #'-',(a0)+
  732.         dbf     d5,ph1
  733.         move.b  #$0a,(a0)+
  734.         clr.b   0(a0)
  735.         bra     putstr
  736.  
  737. ;move cursor to a column
  738. ;d0 = current position
  739. ;d1 = column
  740. tab        move.l  a3,-(a7)
  741.         lea     out,a3
  742. sp5        cmp.b   d1,d0
  743.         bcc.s   sp4
  744.         move.b  #' ',0(a3,d0)
  745.         addq.b  #1,d0
  746.         bra.s   sp5
  747. sp4        move.l  d1,ptr
  748.         move.l  (a7)+,a3
  749.         rts
  750.  
  751. ;convert ascii to byte
  752. ;a0 = pointer to text
  753. ;d0 = byte
  754. getnum        cmp.b   #'$',0(a0)
  755.         bne.s   isdec
  756.         bsr     readhex
  757.         move.l  d0,d2
  758.         rts
  759. isdec        moveq   #0,d2
  760.         move.l  d2,d3
  761.         move.l  d2,d6
  762.         move.l  d2,d7
  763.         cmp.b   #'-',0(a0)
  764.         bne.s   gn1
  765.         addq    #1,a0
  766.         moveq.l #1,d6
  767. gn1        move.b  (a0)+,d3
  768.         cmp.b   #'9',d3
  769.         bhi.s   gn2
  770.         cmp.b   #'0',d3
  771.         bcs.s   gn2
  772.         moveq   #1,d7
  773.         and.b   #$f,d3
  774.         muls    #10,d2
  775.         add.l   d3,d2
  776.         bra.s   gn1
  777. gn2        tst.b   d6
  778.         beq.s   gn3
  779.         neg.l   d2
  780. gn3        tst.b   d7
  781.         bne.s   gn4
  782.         subq    #1,a0
  783. gn4        rts
  784.  
  785. getfrac     bsr     isdec
  786.         muls    #10,d2
  787.         cmp.b   #'.',-1(a0)
  788.         bne.s   1$
  789.         moveq   #0,d0
  790.         move.b  (a0)+,d1
  791.         cmp.b   #10,d1
  792.         beq.s   1$
  793.         and.b   #15,d1
  794.         add.l   d1,d2
  795. 1$        rts
  796.  
  797. ;convert hex to longword
  798. ;a0 = pointer to text
  799. ;returns d0=value
  800. ;d7 = ok/error 1/0
  801. readhex     movem.l d1-d6/a1-a5,-(a7)
  802.         moveq   #1,d7
  803.         cmp.b   #'$',0(a0)
  804.         bne.s   rh3
  805.         addq    #1,a0
  806. rh3        moveq   #0,d0
  807.         cmpi.b  #10,0(a0)
  808.         beq.s   rherr
  809.         lea     hextab(pc),a1
  810. rh0        move.b  (a0)+,d3
  811.         moveq.l #15,d2
  812. rh1        cmp.b   0(a1,d2),d3
  813.         beq.s   rh2
  814.         dbf     d2,rh1
  815.         bra     rhend
  816. rh2        lsl.l   #4,d0
  817.         or.b    d2,d0
  818.         bra.s   rh0
  819. rhend        tst.b   d3
  820.         beq.s   rhok
  821.         cmpi.b  #10,d3
  822.         beq.s   rhok
  823.         cmpi.b  #' ',d3
  824.         beq.s   rhok
  825. rherr        moveq   #0,d7
  826. rhok        movem.l (a7)+,d1-d6/a1-a5
  827.         rts
  828.  
  829. ;skip blanks
  830. ;a0 pointer to text
  831. ; returns a0 = new pointer position
  832. kllblnks    cmpi.b  #' ',0(a0)
  833.         bne.s   gn4
  834.         addq    #1,a0
  835.         bra.s   kllblnks
  836.  
  837. ; exit program. If background flag is set, wait for
  838. ; amiga-amiga-x
  839.  
  840. stopall     addq    #4,a7
  841.         bra     exitall
  842.  
  843. exit        tst.b   background
  844.         bne     quithold
  845. exitall     bsr     killpage
  846.         bsr     freeblank
  847.         bsr     killhistory
  848.         move.l  stplist(PC),a3
  849.         tst.l   0(a3)
  850.         beq.s   ex0
  851.         move.l  a3,d0
  852.         bsr     waok
  853.         bra.s   exitall
  854.  
  855. ex0        tst.b   background
  856.         beq.s   ex1
  857.         bsr     removeh
  858.  
  859. ex1        move.l  _SysBase(PC),a1
  860.         move.l  #_LVOSwitch,a0
  861.         move.l  oldswitch,d0
  862.         CALL    SetFunction,_SysBase(PC)
  863.         moveq   #3,d0
  864.         lea     IOCounter(PC),a1
  865.         CALL    RemIntServer,_SysBase(PC)
  866.  
  867.         move.l  replyport(PC),-(a7)
  868.         LIBCALL DeletePort
  869.         addq    #4,a7
  870.         bsr     stoptimer
  871.         lea     timerio,a1
  872.         CALL    CloseDevice,_SysBase(PC)
  873.         move.l  timerport(PC),-(a7)
  874.         LIBCALL DeletePort
  875.         addq    #4,a7
  876.  
  877.         bsr     restoretrap
  878.  
  879.         tst.l   wnptr
  880.         beq.s   5$
  881.         move.l  wnptr(PC),a0
  882.         CALL    CloseWindow,intuibase(PC)
  883. 5$        move.l  screenptr(PC),d0
  884.         beq.s   6$
  885.         move.l  d0,a0
  886.         CALL    CloseScreen,intuibase(PC)
  887.         clr.l   screenptr
  888.  
  889. 6$        move.l  infile(PC),d1
  890.         beq.s   ex11
  891.         CALL    Close,dosbase(PC)
  892. ex11        bsr     freehidmem
  893.         bsr     freealias
  894.         bsr     clrfkeys
  895.         move.l  realstack(PC),a7
  896.     IFND DEBUG
  897.         CALL    Forbid,_SysBase(PC)
  898.         move.l  wbmsg(PC),d0
  899.         beq.s   todos
  900.         move.l  d0,a1
  901.         CALL    ReplyMsg,_SysBase(PC)
  902.         moveq   #0,d0
  903.         rts
  904.  
  905. todos        move.l  mytask(PC),a0
  906.         move.l  152(a0),d1
  907.         CALL    UnLock,dosbase(PC)
  908.         move.l  myseg(PC),d1
  909.         CALL    UnLoadSeg,dosbase(PC)
  910.     ENDC
  911.         moveq   #0,d0
  912.         rts
  913.  
  914. ;print a bcpl-string
  915. ;d0 = bcpl-pointer to bcpl-string
  916. putbcpl     movem.l d3/a0-a1,-(a7)
  917.         tst.l   d0
  918.         beq.s   pb1
  919.         lsl.l   #2,d0
  920.         move.l  d0,a1
  921.         moveq   #0,d3
  922.         move.b  (a1)+,d3
  923.         subq    #1,d3
  924.         move.l  ptr(PC),d0
  925.         lea     out,a0
  926. pb2        move.b  (a1)+,0(a0,d0)
  927.         beq.s   1$
  928.         addq.b  #1,d0
  929.         dbf     d3,pb2
  930. 1$        move.l  d0,ptr
  931. pb1        movem.l (a7)+,d3/a0-a1
  932.         rts
  933.  
  934. ;compare strings
  935. ;a0/a1 = pointers to string
  936. ;returns d0 = true(0) false(1), d1 = length
  937. strcmp        movem.l a0-a1,-(a7)
  938.         moveq   #0,d0
  939.         move.l  d0,d1
  940. src2        move.b  (a0)+,d0
  941.         beq.s   src1
  942.         cmp.b   #10,d0
  943.         beq.s   src1
  944.         addq    #1,d1
  945.         cmp.b   (a1)+,d0
  946.         beq.s   src2
  947.         bra.s   src3
  948. src1        move.b  0(a1),d0
  949. src3        movem.l (a7)+,a0-a1
  950.         rts
  951.  
  952. strbuf        movem.l d0/a1-a2,-(a7)
  953.         move.l  a0,a1
  954.         lea     buffer,a2
  955. 1$        move.b  (a1)+,d0
  956.         cmp.b   #10,d0
  957.         beq.s   2$
  958.         cmp.b   #' ',d0
  959.         beq.s   2$
  960.         or.b    #' ',d0
  961.         beq.s   2$
  962.         move.b  d0,(a2)+
  963.         bra.s   1$
  964. 2$        clr.b   (a2)+
  965.         movem.l (a7)+,d0/a1-a2
  966.         rts
  967.  
  968. ;compare bcpl string with string
  969. ;a0 = pointer to string
  970. ;a2 = bcpl-pointer to bcpl-string
  971. ;returns d0 = true(0) false(1)
  972. strbcmp     movem.l d1/a0/a2,-(a7)
  973.         moveq   #0,d0
  974.         moveq   #0,d1
  975.         adda.l  a2,a2
  976.         adda.l  a2,a2
  977.         move.b  (a2)+,d1
  978.         beq.s   stb1
  979.         subq    #1,d1
  980. stb2        cmp.b   (a2)+,(a0)+
  981.         bne.s   stb1
  982.         dbf     d1,stb2
  983.         moveq   #1,d0
  984. stb1        movem.l (a7)+,d1/a0/a2
  985.         rts
  986.  
  987. ;add a fkey definition to the fkey list. Each entry
  988. ;looks like this: long Succ, long Pred, byte Key#, byte length,
  989. ;          char text[]
  990.  
  991. setfkey     bsr     nodenam
  992.         move.b  procnum(PC),d5
  993.         beq     syntax
  994.         cmp.b   #21,d5
  995.         bge     syntax
  996.         subq    #1,d5
  997.         move.b  d5,procnum
  998.         lea     fkeys(PC),a1
  999. 1$        move.l  0(a1),a1
  1000.         tst.l   0(a1)
  1001.         beq.s   2$
  1002.         cmp.b   8(a1),d5
  1003.         bne.s   1$
  1004.         move.l  a1,d3
  1005.         CALL    Remove,_SysBase(PC)
  1006.         move.l  d3,a1
  1007.         bsr     removefkey
  1008. 2$        tst.b   0(a5)
  1009.         beq.s   4$
  1010.         move.l  a5,a0
  1011.         bsr     strlen
  1012.         move.l  d0,d5
  1013.         add.w   #10,d0
  1014.         moveq   #0,d1
  1015.         CALL    AllocMem,_SysBase(PC)
  1016.         tst.l   d0
  1017.         beq.s   4$
  1018.         move.l  d0,a1
  1019.         move.l  d0,a4
  1020.         move.b  procnum(PC),8(a1)
  1021.         move.b  d5,9(a1)
  1022.         lea     fkeys(PC),a0
  1023.         CALL    AddHead,_SysBase(PC)
  1024.         lea     10(a4),a4
  1025.         subq    #1,d5
  1026. 3$        move.b  (a5)+,(a4)+
  1027.         dbeq    d5,3$
  1028. 4$        rts
  1029.  
  1030. clrfkeys    lea     fkeys(PC),a0
  1031.         CALL    RemHead,_SysBase(PC)
  1032.         tst.l   d0
  1033.         beq.s   1$
  1034.         move.l  d0,a1
  1035.         bsr     removefkey
  1036.         bra.s   clrfkeys
  1037. 1$        rts
  1038.  
  1039. removefkey  move.b  0(a1),d0
  1040.         ext.w   d0
  1041.         ext.l   d0
  1042.         add.w   #10,d0
  1043.         CALL    FreeMem,_SysBase(PC)
  1044.         rts
  1045.  
  1046. ;convert long to decimal
  1047. ;d0 = value
  1048. ;d3 bit 0 = left/right justified
  1049. ;d3 bit 1 = write/leave
  1050. ;returns string in 'buffer'
  1051. longdec     movem.l d1-d2/a1-a2,-(a7)
  1052.         tst.l   d0
  1053.         bmi.s   2$
  1054.         cmp.l   #9999999,d0
  1055.         ble.s   1$
  1056. 2$        move.l  #smallnix,d0
  1057.         bra.s   ld6
  1058. 1$        lea     binarea+8(PC),a1
  1059.         move.l  #'    ',-8(a1)
  1060.         move.l  #'    ',-4(a1)
  1061.         clr.b   0(a1)
  1062.         subq    #1,a1
  1063.         cmp     #2,d3
  1064.         bne.s   ld5
  1065.         clr.b   0(a1)
  1066. ld5        moveq   #1,d2
  1067. ld2        addq    #1,d2
  1068.         moveq   #$a,d1
  1069.         bsr     div
  1070.         addi.l  #$30,d1
  1071.         move.b  d1,-(a1)
  1072.         tst.l   d0
  1073.         bne.s   ld2
  1074.  
  1075.         btst    #0,d3
  1076.         bne.s   ld1
  1077.         lea     binarea(PC),a2
  1078.         cmpa.l  a2,a1
  1079.         bne.s   ld3
  1080.         subq.l  #1,ptr
  1081.         bra.s   ld1
  1082. ld3        move.b  0(a1),(a2)+
  1083.         move.b  #' ',(a1)+
  1084.         dbf     d2,ld3
  1085. ld1        cmp     #2,d3
  1086.         beq.s   ld4
  1087.         move.l  #binarea,d0
  1088. ld6        bsr     putstr
  1089. ld4        movem.l (a7)+,d1-d2/a1-a2
  1090.         rts
  1091.  
  1092. ;write UBYTE
  1093. ;d3 = value
  1094. bytedec     bsr     dec
  1095.         move.l  #decimal,d0
  1096.         bra.s   pm1
  1097.  
  1098. ;write signed byte
  1099. ;d3 = value
  1100. plusmins    movem.l d5/a3,-(a7)
  1101.         move.w  #$2020,minus
  1102.         move.b  d3,d5
  1103.         bpl.s   2$
  1104.         neg.b   d3
  1105. 2$        bsr.s   dec
  1106.         tst.b   d5
  1107.         bpl.s   1$
  1108.         move.l  d0,a3
  1109.         move.b  #'-',-(a3)
  1110. 1$        movem.l (a7)+,d5/a3
  1111.         move.l  #minus+1,d0
  1112. pm1        bra     putstr
  1113.  
  1114. dec        movem.l d3/a3,-(a7)
  1115.         move.l  #$20202020,decimal
  1116.         and.l   #$ff,d3
  1117.         lea     decimal+3(PC),a3
  1118. bloop        tst.b   d3
  1119.         beq.s   bend
  1120.         divu    #10,d3
  1121.         swap    d3
  1122.         ori.b   #'0',d3
  1123.         move.b  d3,-(a3)
  1124.         clr.w   d3
  1125.         swap    d3
  1126.         bra.s   bloop
  1127. bend        cmpa.l  #decimal+3,a3
  1128.         bne     1$
  1129.         move.b  #'0',-(a3)
  1130. 1$        move.l  a3,d0
  1131.         movem.l (a7)+,d3/a3
  1132.         rts
  1133.  
  1134. ;write a string, move cursor into next line
  1135. ;d0 = pointer to text
  1136. putnam        bsr     putstr
  1137. putnam1     tst.b   d0
  1138.         beq.s   ncr
  1139.         bsr     newline
  1140. ncr        rts
  1141.  
  1142. ;write one char
  1143. ;d0 = char
  1144. putchar     movem.l d1/a0,-(a7)
  1145.         move.l  ptr(PC),d1
  1146.         lea     out,a0
  1147.         move.b  d0,0(a0,d1)
  1148.         addq.l  #1,ptr
  1149.         movem.l (a7)+,d1/a0
  1150.         rts
  1151.  
  1152. ;write a string, strings are only put into the output buffer when
  1153. ;a LF is detected
  1154. ;d0 = pointer to string
  1155. ;returns d0 = cursor position
  1156. putstr        movem.l d1-d7/a0-a6,-(a7)
  1157.         move.b  #1,printed
  1158.         move.l  d0,a2
  1159.         lea     out,a3
  1160.         move.l  ptr(PC),d0
  1161.         move.l  a2,d5
  1162.         bne     pst1
  1163.         lea     longnix(PC),a2
  1164.  
  1165. pst1        move.b  (a2)+,d1
  1166.         cmpi.b  #13,d1
  1167.         beq     pst1
  1168.         cmpi.b  #10,d1
  1169.         beq.s   lineend
  1170.         move.b  d1,0(a3,d0)
  1171.         beq     prend
  1172.         cmp     #100,d0
  1173.         bge.s   pst1
  1174.         addq    #1,d0
  1175.         bra.s   pst1
  1176.  
  1177. lineend     tst.b   fromfile
  1178.         beq.s   1$
  1179.         moveq   #0,d0
  1180.         bra     prend
  1181.  
  1182. 1$        tst.l   lastprinted
  1183.         bne.s   2$
  1184.         bsr     killpage
  1185.  
  1186. 2$        addq    #1,d0
  1187.         move.l  d0,-(a7)
  1188.         add     #14,d0
  1189.         moveq   #0,d1
  1190.         CALL    AllocMem,_SysBase(PC)
  1191.         move.l  (a7)+,d1
  1192.         tst.l   d0
  1193.         beq     prend
  1194.         move.l  d0,a0
  1195.         move.w  d1,12(a0)
  1196.         cmp.w   maxllength(PC),d1
  1197.         ble.s   7$
  1198.         move.w  d1,maxllength
  1199. 7$        move.l  node,8(a0)
  1200.         clr.l   node
  1201.         clr.l   0(a0)
  1202.  
  1203.         move.l  lastprinted(PC),d0
  1204.         move.l  d0,4(a0)
  1205.         bne.s   3$
  1206.         move.l  a0,outchain
  1207.         bra.s   4$
  1208. 3$        move.l  d0,a1
  1209.         move.l  a0,0(a1)
  1210. 4$        move.l  a0,lastprinted
  1211.         move.b  #' ',14(a0)
  1212.         subq    #1,d1
  1213.         lea     15(a0),a0
  1214.         lea     out,a1
  1215.         subq    #1,d1
  1216.         bmi.s   6$
  1217. 5$        move.b  (a1)+,(a0)+
  1218.         dbf     d1,5$
  1219. 6$        move.l  numlines(PC),d2
  1220.         cmp.l   maxlines(PC),d2
  1221.         ble.s   8$
  1222.  
  1223.         move.l  outchain(PC),a1
  1224.         move.l  0(a1),a2
  1225.         move.l  a2,outchain
  1226.         clr.l   4(a2)
  1227.         move.w  12(a1),d0
  1228.         add.w   #14,d0
  1229.         ext.l   d0
  1230.         CALL    FreeMem,_SysBase(PC)
  1231.         bra.s   9$
  1232.  
  1233. 8$        addq.l  #1,d2
  1234.         move.l  d2,numlines
  1235.  
  1236. 9$        moveq   #0,d0
  1237.         move.l  d0,d5
  1238.         tst.b   addlines
  1239.         beq     pst1
  1240.         bsr     addline
  1241.         bra     pst1
  1242. prend        move.l  d0,ptr
  1243.         movem.l (a7)+,d1-d7/a0-a6
  1244.         rts
  1245.  
  1246. ;Kill output buffer
  1247. killpage    movem.l d0-d7/a0-a6,-(a7)
  1248.         tst.l   outchain
  1249.         beq.s   2$
  1250.         move.l  outchain(PC),a1
  1251.         bsr     killlines
  1252.         clr.l   outchain
  1253.         clr.l   lastprinted
  1254.         clr.l   numlines
  1255.         clr.w   maxllength
  1256. 2$        movem.l (a7)+,d0-d7/a0-a6
  1257.         rts
  1258.  
  1259. ;kill the remainder of the output buffer
  1260. killlines   move.l  0(a1),-(a7)
  1261.         move.w  12(a1),d0
  1262.         ext.l   d0
  1263.         add     #14,d0
  1264.         CALL    FreeMem,_SysBase(PC)
  1265.         move.l  (a7)+,a1
  1266.         move.l  a1,d7
  1267.         bne.s   killlines
  1268.         rts
  1269.  
  1270. freeblank   move.l  blanks(PC),d0
  1271.         beq.s   1$
  1272.         move.l  d0,a1
  1273.         move.w  colms(PC),d0
  1274.         ext.l   d0
  1275.         CALL    FreeMem,_SysBase(PC)
  1276.         clr.l   blanks
  1277. 1$        rts
  1278.  
  1279. ;write a portion of the output buffer to the screen
  1280. blastout    move.l  rastport(PC),a1
  1281.         moveq   #1,d0
  1282.         CALL    SetAPen,gfxbase(PC)
  1283.         move.l  rastport(PC),a1
  1284.         moveq   #1,d0
  1285.         CALL    SetDrMd,gfxbase(PC)
  1286.         moveq   #0,d7
  1287.  
  1288.         move.w  loffset(PC),d2
  1289.         beq.s   7$
  1290.         move.w  colms(PC),d4
  1291.         add.w   d4,d2
  1292.         move.w  maxllength(PC),d3
  1293.         cmp.w   d3,d2
  1294.         ble.s   7$
  1295.         move.w  d3,d2
  1296.         sub.w   d4,d2
  1297.         bpl.s   8$
  1298.         moveq   #0,d2
  1299. 8$        move.w  d2,loffset
  1300.  
  1301. 7$        bsr     tstfirstlin
  1302.  
  1303. 1$        tst.l   outchain
  1304.         beq.s   3$
  1305.         bsr     findline
  1306.  
  1307. 2$        move.w  colms(PC),d5
  1308.         ext.l   d5
  1309.         move.w  loffset(PC),d4
  1310.         ext.l   d4
  1311.         moveq   #18,d6
  1312. 6$        lea     14(a5,d4),a0
  1313.         move.w  12(a5),d3
  1314.         ext.l   d3
  1315.         bsr     blastline
  1316.         bge.s   3$
  1317.         tst.l   0(a5)
  1318.         beq.s   5$
  1319.         move.l  0(a5),a5
  1320.         bra     6$
  1321. 5$        moveq   #0,d3
  1322.         bsr     blastline
  1323.         bcs.s   5$
  1324. 3$        rts
  1325.  
  1326. ;get a pointer to a line  (line # in d0)
  1327. findline    move.l  outchain(PC),d1
  1328.         beq     2$
  1329.         move.l  d1,a5
  1330. 1$        tst     d0
  1331.         beq.s   2$
  1332.         tst.l   0(a5)
  1333.         beq.s   2$
  1334.         move.l  0(a5),a5
  1335.         dbf     d0,1$
  1336. 2$        rts
  1337.  
  1338. ;check if the display is as 'full' as possible
  1339. tstfirstlin move.l  firstline(PC),d0
  1340.         move.l  d0,d2
  1341.         add.w   rows(PC),d2
  1342.         cmp.l   numlines(PC),d2
  1343.         bmi.s   1$
  1344.         move.l  numlines(PC),d2
  1345.         sub.w   rows(PC),d2
  1346.         bpl.s   4$
  1347.         moveq   #0,d2
  1348. 4$        move.l  d2,d0
  1349.         move.l  d2,firstline
  1350. 1$        rts
  1351.  
  1352. ;display one line, fill the gap between the end of the line and
  1353. ;the end of the window with spaces.
  1354. ;d6 = ypos, d5=colms, d3= linelength, d7= line # in window, a0 = text
  1355.  
  1356. blastline   move    d6,d1
  1357.         moveq   #6,d0
  1358.         move.l  rastport(PC),a1
  1359.         CALL    Move,gfxbase(PC)
  1360.         sub.w   d4,d3
  1361.         bpl.s   7$
  1362.         moveq   #0,d3
  1363.         bra.s   6$
  1364. 7$        cmp.w   d5,d3
  1365.         bmi.s   4$
  1366.         move.w  d5,d3
  1367. 4$        move.l  d3,d0
  1368.         beq.s   6$
  1369.         move.l  rastport(PC),a1
  1370.         CALL    Text,gfxbase(PC)
  1371. 6$        move.l  d5,d0
  1372.         sub.l   d3,d0
  1373.         ble.s   5$
  1374.         move.l  blanks(PC),a0
  1375.         move.l  rastport(PC),a1
  1376.         CALL    Text,gfxbase(PC)
  1377. 5$        addq    #8,d6
  1378.         addq    #1,d7
  1379.         cmp.w   rows(PC),d7
  1380.         rts
  1381.  
  1382. ;Write pointer, display '-------' if empty
  1383. hexan        tst.l   d0
  1384.         bne.s   hexa
  1385.         bra     putstr
  1386.  
  1387. ;Write 8 byte hex value
  1388. ;d0 = value
  1389. hexa        bsr     gthex
  1390.         bra     putstr
  1391.  
  1392. gthex        movem.l d1-d7/a0-a6,-(a7)
  1393.         moveq.l #7,d5
  1394.         lea     hexarea(PC),a1
  1395.         lea     hextab(PC),a0
  1396.         moveq   #0,d2
  1397. hexloop     move.b  d0,d2
  1398.         and.b   #15,d2
  1399.         move.b  0(a0,d2),0(a1,d5)
  1400.         lsr.l   #4,d0
  1401.         dbf     d5,hexloop
  1402.         move.l  a1,d0
  1403.         movem.l (a7)+,d1-d7/a0-a6
  1404.         rts
  1405.  
  1406. ;Convert/write byte into binary string
  1407. ;d0 = value
  1408. bin        movem.l d1-d7/a0-a6,-(a7)
  1409.         lea     binarea(PC),a0
  1410.         move.w  #$2020,8(a0)
  1411.         moveq.l #7,d4
  1412. binloop     moveq.l #'0'/2,d1
  1413.         roxr.b  #1,d0
  1414.         roxl.b  #1,d1
  1415.         move.b  d1,0(a0,d4)
  1416.         dbf     d4,binloop
  1417.         move.l  a0,d0
  1418.         movem.l (a7)+,d1-d7/a0-a6
  1419.         bra     putstr
  1420.  
  1421. ;send a packet
  1422. ;a0 = msgport
  1423. ;dp_Type and dp_Arg1 have to be inizialized
  1424. cons1        movem.l d0-d7/a0-a6,-(a7)
  1425.         move.l  #dp_Link,LN_NAME
  1426.         move.l  #mypacket,dp_Link
  1427.         move.l  replyport(PC),dp_Port
  1428.         lea     mypacket,a1
  1429.         CALL    PutMsg,_SysBase(PC)
  1430.         move.l  replyport,a0
  1431.         CALL    WaitPort,_SysBase(PC)
  1432.         move.l  replyport(PC),a0
  1433.         CALL    GetMsg,_SysBase(PC)
  1434.         movem.l (a7)+,d0-d7/a0-a6
  1435.         rts
  1436.  
  1437. ;32-bit division
  1438. ;d0 / d1
  1439. ;returns d0
  1440. div        movem.l d2-d3,-(a7)
  1441.         tst.l   d1
  1442.         beq     div8
  1443.         swap    d1
  1444.         move.w  d1,d2
  1445.         bne.s   div1
  1446.         swap    d0
  1447.         swap    d1
  1448.         swap    d2
  1449.         move.w  d0,d2
  1450.         beq.s   div2
  1451.         divu    d1,d2
  1452.         move.w  d2,d0
  1453. div2        swap    d0
  1454.         move.w  d0,d2
  1455.         divu    d1,d2
  1456.         move.w  d2,d0
  1457.         swap    d2
  1458.         move.w  d2,d1
  1459.         bra     div8
  1460. div1        moveq   #$10,d3
  1461.         cmpi.w  #$80,d1
  1462.         bcc.s   div3
  1463.         rol.l   #8,d1
  1464.         subq.w  #8,d3
  1465. div3        cmpi.w  #$800,d1
  1466.         bcc.s   div4
  1467.         rol.l   #4,d1
  1468.         subq.w  #4,d3
  1469. div4        cmpi.w  #$2000,d1
  1470.         bcc.s   div5
  1471.         rol.l   #2,d1
  1472.         subq.w  #2,d3
  1473. div5        tst.w   d1
  1474.         bmi.s   div6
  1475.         rol.l   #1,d1
  1476.         subq.w  #1,d3
  1477. div6        move.w  d0,d2
  1478.         lsr.l   d3,d0
  1479.         swap    d2
  1480.         clr.w   d2
  1481.         lsr.l   d3,d2
  1482.         swap    d3
  1483.         divu    d1,d0
  1484.         move.w  d0,d3
  1485.         move.w  d2,d0
  1486.         move.w  d3,d2
  1487.         swap    d1
  1488.         mulu    d1,d2
  1489.         sub.l   d2,d0
  1490.         bcc.s   div7
  1491.         subq.w  #1,d3
  1492.         add.l   d1,d0
  1493. div7        moveq   #0,d1
  1494.         move.w  d3,d1
  1495.         swap    d3
  1496.         rol.l   d3,d0
  1497.         swap    d0
  1498.         exg     d1,d0
  1499. div8        movem.l (a7)+,d2-d3
  1500.         rts
  1501.  
  1502. ;install a input-handler
  1503. installh    pea     0
  1504.         pea     xopsleep
  1505.         LIBCALL CreatePort
  1506.         addq    #8,a7
  1507.         move.l  d0,InputMsg
  1508.         move.l  d0,-(a7)
  1509.         LIBCALL CreateStdIO
  1510.         addq    #4,a7
  1511.         move.l  d0,InRequest
  1512.         move.l  d0,a1
  1513.         lea     devicenam(PC),a0
  1514.         moveq   #0,d0
  1515.         moveq   #0,d1
  1516.         CALL    OpenDevice,_SysBase(PC)
  1517.         move.l  d0,devstatus
  1518.         movea.l InRequest(PC),a1
  1519.         move.l  #InInterrupt,40(a1)
  1520.         move.w  #9,28(a1)
  1521.         CALL    DoIO,_SysBase(PC)
  1522.         move.l  d0,iostatus
  1523.         move.l  #-1,d0
  1524.         CALL    AllocSignal,_SysBase(PC)
  1525.         moveq   #0,d1
  1526.         bset    d0,d1
  1527.         move.l  d1,mysignal
  1528.         rts
  1529.  
  1530. ;remove handler
  1531. removeh     movea.l InRequest(PC),a1
  1532.         move.l  #InInterrupt,40(a1)
  1533.         move.w  #10,28(a1)
  1534.         CALL    DoIO,_SysBase(PC)
  1535.         movea.l InRequest(PC),a1
  1536.         CALL    CloseDevice,_SysBase(PC)
  1537.         move.l  InRequest,-(a7)
  1538.         LIBCALL DeleteStdIO
  1539.         addq    #4,a7
  1540.         move.l  InputMsg,-(a7)
  1541.         LIBCALL DeletePort
  1542.         addq    #4,a7
  1543.         rts
  1544.  
  1545. ;this is the handler, it checks if amiga-amiga-x
  1546. ;has been pressed and signals it to our task
  1547. Keyhandler  tst.b   running
  1548.         bne.s   endhandler
  1549.         cmp.b   #1,4(a0)
  1550.         bne.s   endhandler
  1551.         move.w  8(a0),d0
  1552.         andi.w  #$c0,d0
  1553.         cmpi.w  #$c0,d0
  1554.         bne.s   endhandler
  1555.         cmp.w   #$32,6(a0)
  1556.         bne.s   endhandler
  1557. wakeup        move.l  a0,-(a7)
  1558.         movea.l mytask(PC),a1
  1559.         move.l  mysignal(PC),d0
  1560.         CALL    Signal,_SysBase(PC)
  1561.         move.l  (a7)+,a0
  1562.         clr.b   4(a0)
  1563. endhandler  move.l  a0,d0
  1564.         rts
  1565.  
  1566. snoop        bsr     cls
  1567.         bsr     nodenam
  1568.         moveq   #1,d7
  1569.         lea     TReNode(PC),a4
  1570.         bsr     findnam
  1571.         tst.b   d7
  1572.         bne.s   1$
  1573.         move.l  #stperr,d0
  1574.         bra     putnam
  1575. 1$        move.l  d0,captask
  1576.         pea     0
  1577.         pea     memportname
  1578.         LIBCALL CreatePort
  1579.         addq    #8,a7
  1580.         move.l  d0,snoopport
  1581.         beq     tm6
  1582.  
  1583.         bsr     replyintui
  1584.         move.b  #1,addlines
  1585.         lea     snoophead(PC),a0
  1586.         bsr     puthead
  1587.         move.l  _SysBase(PC),a1
  1588.         move.l  -196(a1),oldalloc
  1589.         move.l  -208(a1),oldfree
  1590.         move.l  #capmalloc,d0
  1591.         move.l  #-198,a0
  1592.         CALL    SetFunction,_SysBase(PC)
  1593.         move.l  _SysBase(PC),a1
  1594.         move.l  #capmfree,d0
  1595.         move.l  #-210,a0
  1596.         CALL    SetFunction,_SysBase(PC)
  1597.         clr.b   bool
  1598.         clr.b   cbreak
  1599.  
  1600. waitmem     move.l  snoopport(PC),a0
  1601.         moveq   #0,d1
  1602.         move.b  15(a0),d1
  1603.         bset    d1,d0
  1604.         move.l  d0,auxsig
  1605.         bsr     processmsgs
  1606.  
  1607. tm7        move.l  mytask(PC),a0
  1608.         move.l  snoopport(PC),a0
  1609.         CALL    GetMsg,_SysBase(PC)
  1610.         tst.l   d0
  1611.         bne     tm8
  1612.         tst.b   cbreak
  1613.         bne     snoopend
  1614.         bra     waitmem
  1615. tm8        move.l  d0,a3
  1616.         move.l  20(a3),d3
  1617.         btst    #31,d3
  1618.         beq     freed
  1619.         move.l  #allok,d0
  1620.         bsr     putstr
  1621.         lea     memname(PC),a2
  1622.         lea     membit(PC),a4
  1623.         moveq   #4,d5
  1624. tm2        move.l  0(a4),d4
  1625.         btst    d4,d3
  1626.         beq.s   tm1
  1627.         move.l  0(a2),d0
  1628.         bsr     putstr
  1629. tm1        addq    #4,a2
  1630.         addq    #4,a4
  1631.         dbf     d5,tm2
  1632.         moveq   #26,d1
  1633.         bsr     tab
  1634.         move.l  24(a3),d0
  1635.         move.l  d0,d3
  1636.         bsr     hexa
  1637.         move.l  28(a3),d0
  1638.         bne.s   tm3
  1639.         move.l  #failed,d0
  1640.         bsr     putstr
  1641.         moveq   #53,d1
  1642.         bsr     tab
  1643.         bra     tm4
  1644. tm3        bsr     hexa
  1645.         move.l  28(a3),d0
  1646.         add.l   d3,d0
  1647.         bsr     hexa
  1648.         bra     tm4
  1649.  
  1650. freed        move.l  #free,d0
  1651.         bsr     putstr
  1652.         move.b  #'-',d0
  1653.         moveq   #18,d1
  1654. tm9        bsr     putchar
  1655.         dbf     d1,tm9
  1656.         move.b  #' ',d0
  1657.         bsr     putchar
  1658.         move.l  d3,d0
  1659.         bsr     hexa
  1660.         move.l  24(a3),d0
  1661.         bsr     hexa
  1662.         move.l  24(a3),d0
  1663.         add.l   d3,d0
  1664.         bsr     hexa
  1665.  
  1666. tm4        move.l  32(a3),d0
  1667.         bsr     hexa
  1668.         bsr     newline
  1669.         move.w  18(a3),d0
  1670.         ext.l   d0
  1671.         move.l  a3,a1
  1672.         CALL    FreeMem,_SysBase(PC)
  1673.         bra     tm7
  1674.  
  1675. snoopend    move.l  _SysBase(PC),a1
  1676.         move.l  oldalloc(PC),d0
  1677.         move.l  #-198,a0
  1678.         CALL    SetFunction,_SysBase(PC)
  1679.         move.l  _SysBase(PC),a1
  1680.         move.l  oldfree,d0
  1681.         move.l  #-210,a0
  1682.         CALL    SetFunction,_SysBase(PC)
  1683.         move.l  snoopport,-(a7)
  1684.         LIBCALL DeletePort
  1685.         addq    #4,a7
  1686.         move.l  #stoped,d0
  1687.         bsr     putnam
  1688.         clr.b   addlines
  1689.         clr.l   auxsig
  1690. tm6        rts
  1691.  
  1692. memname     dc.l    memlarg,memclr,memfast,memchip,mempubl
  1693. membit        dc.l    17,16,2,1,0
  1694.  
  1695. capmalloc   movem.l d0-d7/a0-a6,-(a7)
  1696.         move.l  _SysBase(PC),a6
  1697.         move.l  276(a6),d4
  1698.         cmp.l   captask(PC),d4
  1699.         bne.s   capm1
  1700.         tst.b   bool
  1701.         bne     capm1
  1702.         move.b  #1,bool
  1703.         moveq   #36,d6
  1704.         bsr     allocmsg
  1705.         beq     capm2
  1706.         bset    #31,d1
  1707.         move.l  d1,20(a5)
  1708.         move.l  d0,24(a5)
  1709.         move.l  60(a7),32(a5)
  1710.         move.l  a5,remembr
  1711.         movem.l (a7)+,d0-d7/a0-a6
  1712.         bsr     memalloc
  1713.         movem.l d0-d7/a0-a6,-(a7)
  1714.         move.l  remembr(PC),a1
  1715.         move.l  d0,28(a1)
  1716.         move.l  snoopport,a0
  1717.         move.b  #5,8(a1)
  1718.         CALL    PutMsg,_SysBase(PC)
  1719.         clr.b   bool
  1720.         movem.l (a7)+,d0-d7/a0-a6
  1721.         rts
  1722. capm2        clr.b   bool
  1723. capm1        movem.l (a7)+,d0-d7/a0-a6
  1724. memalloc    dc.w    $4ef9
  1725. oldalloc    dc.l    0
  1726.  
  1727. capmfree    movem.l d0-d7/a0-a6,-(a7)
  1728.         move.l  _SysBase(PC),a6
  1729.         move.l  276(a6),d4
  1730.         cmp.l   captask(PC),d4
  1731.         bne.s   capf1
  1732.         tst.b   bool
  1733.         bne.s   capf1
  1734.         move.b  #1,bool
  1735.         moveq   #36,d6
  1736.         bsr     allocmsg
  1737.         beq.s   capf2
  1738.         move.l  d0,20(a5)
  1739.         move.l  a1,24(a5)
  1740.         move.l  60(a7),32(a5)
  1741.         move.l  snoopport,a0
  1742.         move.b  #5,8(a5)
  1743.         move.l  a5,a1
  1744.         CALL    PutMsg,_SysBase(PC)
  1745. capf2        clr.b   bool
  1746. capf1        movem.l (a7)+,d0-d7/a0-a6
  1747.         dc.w    $4ef9
  1748. oldfree     dc.l    0
  1749.  
  1750. allocmsg    movem.l d0-d1/a0-a1,-(a7)
  1751.         move.l  d6,d0
  1752.         move.l  #65536,d1
  1753.         bsr     memalloc
  1754.         tst.l   d0
  1755.         beq.s   alm1
  1756.         move.l  d0,a5
  1757.         move.w  d6,18(a5)
  1758. alm1        movem.l (a7)+,d0-d1/a0-a1
  1759.         move.l  a5,d6
  1760.         rts
  1761.  
  1762. myswitch    movem.l d0-d1/a0-a1,-(a7)
  1763.         move.l  _SysBase(PC),a0
  1764.         move.l  276(a0),d0
  1765.         move.l  tasksnum(PC),d1
  1766.         lea     cputime,a0
  1767.         subq.l  #1,d1
  1768.         bmi.s   swadd
  1769. sw0        cmp.l   (a0)+,d0
  1770.         dbeq    d1,sw0
  1771.         tst     d1
  1772.         bmi.s   swadd
  1773. swi1        add.l   #1,508(a0)
  1774. swgo        movem.l (a7)+,d0-d1/a0-a1
  1775.         dc.w    $4ef9
  1776. oldswitch   dc.l    0
  1777. swadd        cmp.l   #125,tasksnum
  1778.         bge.s   swgo
  1779.         addq.l  #1,tasksnum
  1780.         move.l  d0,0(a0)
  1781.         move.l  #1,512(a0)
  1782.         bra.s   swgo
  1783.  
  1784. countio     addq.l #1,iocount
  1785.         moveq  #0,d0
  1786. cio1        rts
  1787.  
  1788. iconbackdrp tst.b   iconifyon
  1789.         beq.s   1$
  1790.         lea     icnwindow,a0
  1791.         eor.l   #$100,14(a0)    ;wn_Flags
  1792. 1$        rts
  1793.  
  1794. iconifyoff  tst.b   iconifyon
  1795.         beq.s   cio1
  1796.         clr.b   iconifyon
  1797.         tst.b   fromfile
  1798.         bne.s   1$
  1799.         move.l  wnptr(PC),d0
  1800.         beq.s   1$
  1801.         move.l  d0,a0
  1802.         lea     iconifgad,a1
  1803.         CALL    RemoveGadget,intuibase(PC)
  1804.         move.l  wnptr(PC),a0
  1805.         CALL    RefreshWindowFrame,intuibase(PC)
  1806. 1$        move.l  #iconify,d0
  1807.  
  1808. killseg     movem.l d1-d2/a0-a4,-(a7)
  1809.         subq    #4,d0
  1810.         move.l  4,a6
  1811.         move.l  276(a6),a4
  1812.         move.l  128(a4),d1
  1813.         lsl.l   #2,d1
  1814.         move.l  d1,a3
  1815.         move.l  12(a3),d1
  1816.         bne.s   2$
  1817.         move.l  172(a4),d1
  1818.         lsl.l   #2,d1
  1819.         move.l  d1,a4
  1820.         move.l  60(a4),d1
  1821.  
  1822. 2$        lsl.l   #2,d1
  1823.         cmp.l   d0,d1
  1824.         beq.s   4$
  1825.         move.l  d1,a4
  1826.         move.l  0(a4),d1
  1827.         beq.s   5$
  1828.         bra.s   2$
  1829.  
  1830. 4$        move.l  d1,a0
  1831.         move.l  0(a0),0(a4)
  1832.         clr.l   0(a0)
  1833.         lsr.l   #2,d1
  1834.         CALL    UnLoadSeg,dosbase(PC)
  1835.         movem.l (a7)+,d1-d2/a0-a4
  1836. 5$        rts
  1837.  
  1838. alert        bsr     stoptimer
  1839.         move.l  excpttask(PC),d0
  1840.         bne.s   alert1
  1841.         move.l  #noguru,d0
  1842.         bra     putnam
  1843. alert1        move.l  #softfail,d0
  1844.         bsr     putstr
  1845.         move.l  excpttask(PC),a0
  1846.         move.l  10(a0),d0
  1847.         bsr     putnam
  1848.         cmp.l   #3,excpterror
  1849.         bne.s   1$
  1850.         move.l  #addrserr,d0
  1851.         bsr     putstr
  1852.         move.l  excptaddr(PC),d0
  1853.         bsr     hexa
  1854.         bsr     newline
  1855. 1$        move.l  #procount,d0
  1856.         bsr     putstr
  1857.         move.l  excptpc(PC),d0
  1858.         bsr     hexa
  1859.         bsr     newline
  1860.         move.l  #gurutxt,d0
  1861.         bsr     putstr
  1862.         move.l  excpterror(PC),d0
  1863.         bsr     hexa
  1864.         lea     out,a0
  1865.         move.l  ptr(PC),d0
  1866.         move.b  #'.',-1(a0,d0)
  1867.         move.l  excpttask(PC),d0
  1868.         bsr     hexa
  1869.         bra     newline
  1870.  
  1871. showguru    bsr     alert
  1872.         tst.b   ownscreen
  1873.         bne.s   5$
  1874.         move.l  wnptr(PC),a0
  1875.         CALL    WindowToFront,intuibase(PC)
  1876.         bra.s   2$
  1877. 5$        move.l  screenptr,a0
  1878.         CALL    ScreenToFront,intuibase(PC)
  1879. 2$        move.l  #whatnow,d0
  1880.         bsr     putnam
  1881.         clr.l   oldpageend
  1882.         bsr     readline
  1883.  
  1884.         cmp.b   #'i',inputbuffer
  1885.         beq.s   4$
  1886. 1$        cmp.b   #'k',inputbuffer
  1887.         bne.s   2$
  1888.         move.l  excpttask(PC),a1
  1889.         tst.l   22(a1)
  1890.         bne.s   3$
  1891.         CALL    RemTask,_SysBase(PC)
  1892.         bra.s   4$
  1893. 3$        move.l  a1,d0
  1894.         bsr     canok
  1895. 4$        clr.l   lastprinted
  1896.         rts
  1897.  
  1898. myaddtask   move.l  a3,-(a7)
  1899.         lea     mytrap(PC),a3
  1900.         move.l  50(a1),d0
  1901.         beq.s   1$
  1902.         cmp.l   oldtrap(PC),d0
  1903.         beq.s   1$
  1904.         lea     myproctrap(PC),a3
  1905.         cmp.l   oldproctrap(PC),d0
  1906.         bne.s   2$
  1907. 1$        move.l  a3,50(a1)
  1908. 2$        move.l  (a7)+,a3
  1909.         dc.w    $4ef9
  1910. OldAddTask  dc.l    0
  1911.  
  1912. myproctrap  bsr     traphandle
  1913.         dc.w    $4ef9
  1914. oldproctrap dc.l    0
  1915.  
  1916. mytrap        bsr     traphandle
  1917.         moveq   #0,d0
  1918.         CALL    Wait,_SysBase(PC)
  1919.         dc.w    $4ef9
  1920. oldtrap     dc.l    0
  1921.  
  1922. traphandle  movem.l d0-d7/a0-a6,$180
  1923.         move.l  4,a6
  1924.         move.l  276(a6),excpttask
  1925.         move.l  4(a7),d0
  1926.         cmp.l   #9,d0
  1927.         beq.s   2$
  1928.         move.l  d0,excpterror
  1929.         moveq   #10,d1
  1930.         cmp.l   #3,d0
  1931.         bne.s   1$
  1932.         move.l  0(a7,d1.w),excptaddr
  1933.         moveq   #18,d1
  1934. 1$        move.l  0(a7,d1.w),excptpc
  1935.         move.l  mytask(PC),a1
  1936.         move.l  trapsignal(PC),d0
  1937.         jsr     _LVOSignal(a6)
  1938. 2$        movem.l $180,d0-d7/a0-a6
  1939.         rts
  1940.  
  1941. trapguru    tst.b   wanttraps
  1942.         bne     restoretrap
  1943.         move.b  #1,wanttraps
  1944.  
  1945. addtraps    tst.b   wanttraps
  1946.         beq     5$
  1947.         move.l  304(a6),oldtrap         ;Original EXEC trap handler
  1948.         moveq   #-1,d0
  1949.         CALL    AllocSignal,_SysBase(PC)
  1950.         moveq   #0,d1
  1951.         bset    d0,d1
  1952.         move.l  d1,trapsignal
  1953.         move.l  #_LVOAddTask,a0        ;need a new AddTask() to change
  1954.         move.l  2(a6,a0),OldAddTask     ;AmigaDos's default trap handler
  1955.         move.l  a6,a1
  1956.         move.l  #myaddtask,d0
  1957.         CALL    SetFunction,_SysBase(PC)
  1958.         CALL    Forbid,_SysBase(PC)     ;change the trap handler of
  1959.         moveq   #0,d5            ;aleady running tasks
  1960.         bsr     getaskdat            ;get task stucture pointers
  1961. 1$        tst.b   entries
  1962.         beq.s   2$
  1963.         lea     -16(a5),a5
  1964.         move.l  0(a5),a4                ;pointer to a task structure
  1965.         lea     myproctrap(PC),a0
  1966.         move.l  50(a4),d0               ;Task->tc_TrapCode
  1967.         cmp.l   oldproctrap(PC),d0      ;AmigaDos Handler ?
  1968.         beq.s   3$
  1969.         lea     mytrap(PC),a0           ;EXEC Handler ?
  1970.         cmp.l   oldtrap(PC),d0
  1971.         bne.s   4$                ;must be a custom one, skip it
  1972. 3$        move.l  a0,50(a4)               ;replace it
  1973. 4$        subq.b  #1,entries
  1974.         bra.s   1$
  1975. 2$        CALL    Permit,_SysBase(PC)
  1976. 5$        rts
  1977.  
  1978. restoretrap tst.b   wanttraps
  1979.         beq.s   6$
  1980.         tst.b   fromfile
  1981.         bne.s   5$
  1982.         move.l  #_LVOAddTask,a0
  1983.         move.l  OldAddTask(PC),d0
  1984.         move.l  _SysBase(PC),a1
  1985.         CALL    SetFunction,_SysBase(PC)
  1986.         CALL    Forbid,_SysBase(PC)
  1987.         bsr     getaskdat
  1988. 1$        tst.b   entries
  1989.         beq.s   2$
  1990.         lea     -16(a5),a5
  1991.         move.l  0(a5),a4
  1992.         move.l  oldproctrap(PC),a0
  1993.         move.l  50(a4),d0
  1994.         cmp.l   #myproctrap,d0
  1995.         beq.s   3$
  1996.         move.l  oldtrap(PC),a0
  1997.         cmp.l   #mytrap,d0
  1998.         bne.s   4$
  1999. 3$        move.l  a0,50(a4)
  2000. 4$        subq.b  #1,entries
  2001.         bra.s   1$
  2002. 2$        CALL    Permit,_SysBase(PC)
  2003.         clr.l   trapsignal
  2004. 5$        clr.b   wanttraps
  2005. 6$        rts
  2006.  
  2007. ;save the contents of the output buffer
  2008. ;to a file
  2009. saveoutput  bsr     nodenam2
  2010.         tst.b   0(a5)
  2011.         beq     syntax
  2012.         move.l  a5,d1
  2013.         move.l  #1006,d2
  2014.         CALL    Open,dosbase(PC)
  2015.         move.l  d0,d5
  2016.         bne.s   1$
  2017.         move.l  #openerr,d0
  2018.         bsr     putstr
  2019.         move.l  a5,d0
  2020.         bra     putnam
  2021. 1$        move.l  outchain(PC),d0
  2022.         beq.s   3$
  2023. 2$        move.l  d0,a5
  2024.         move.w  12(a5),d3
  2025.         beq.s   4$
  2026.         ext.l   d3
  2027.         lea     14(a5),a1
  2028.         move.l  a1,d2
  2029.         move.l  d5,d1
  2030.         CALL    Write,dosbase(PC)
  2031.         tst.l   d0
  2032.         ble.s   3$
  2033. 4$        moveq   #1,d3
  2034.         move.l  d5,d1
  2035.         move.l  #cr,d2
  2036.         CALL    Write,dosbase(PC)
  2037.         tst.l   d0
  2038.         ble.s   3$
  2039.         move.l  0(a5),d0
  2040.         bne.s   2$
  2041. 3$        move.l  d5,d1
  2042.         CALL    Close,dosbase(PC)
  2043.         rts
  2044.  
  2045. grabtimerio lea     tiohead(PC),a0
  2046.         bsr     puthead
  2047.         move.b  timeout(PC),d4
  2048.         move.b  #255,timeout
  2049.         bsr     starttimer
  2050.         move.b  d4,timeout
  2051.         lea     timerio,a1
  2052.         CALL    Disable,_SysBase(PC)
  2053. 2$        move.l  0(a1),d2
  2054.         beq.s   1$
  2055.         move.l  d2,a1
  2056.         bra.s   2$
  2057. 1$        CALL    Enable,_SysBase(PC)
  2058.         lea     -4(a1),a5
  2059.         bsr     stoptimer
  2060.         lea     buffer,a4
  2061.         moveq   #1,d4
  2062.         bsr     gettrq
  2063.  
  2064.         lea     timerio,a0
  2065.         lea     dummy,a1
  2066.         moveq   #40,d0
  2067.         CALL    CopyMem,_SysBase(PC)
  2068.  
  2069.         lea     dummy,a1
  2070.         lea     timernam(PC),a0
  2071.         moveq   #0,d1
  2072.         moveq   #0,d0
  2073.         CALL    OpenDevice,_SysBase(PC)
  2074.  
  2075.         lea     dummy,a1
  2076.         move.l  #1<<30,32(a1)
  2077.         CALL    SendIO,_SysBase(PC)
  2078.  
  2079.         lea     dummy,a5
  2080.         CALL    Disable,_SysBase(PC)
  2081. 8$        move.l  0(a5),d2
  2082.         beq.s   7$
  2083.         move.l  d2,a5
  2084.         bra.s   8$
  2085. 7$        CALL    Enable,_SysBase(PC)
  2086.         lea     -4(a5),a5
  2087.  
  2088.         lea     dummy,a1
  2089.         CALL    AbortIO,_SysBase(PC)
  2090.         lea     timerio,a1
  2091.         CALL    WaitIO,_SysBase(PC)
  2092.         move.w  timersig,d0
  2093.         moveq   #0,d1
  2094.         bset    d0,d1
  2095.         moveq   #0,d0
  2096.         CALL    SetSignal,_SysBase(PC)
  2097.  
  2098.         moveq   #0,d4
  2099.         bsr     gettrq
  2100.  
  2101.         lea     dummy,a1
  2102.         CALL    CloseDevice,_SysBase(PC)
  2103.  
  2104.         clr.l   (a4)+
  2105.         lea     -22(a4),a2
  2106.         moveq   #18,d2
  2107.         bsr     sortlist
  2108.  
  2109.         lea     buffer,a5
  2110. 5$        move.l  (a5)+,d0
  2111.         beq.s   6$
  2112.         bsr     hexa
  2113.         move.w  (a5)+,d0
  2114.         ext.l   d0
  2115.         mulu    #9,d0
  2116.         add.l   #timerunits,d0
  2117.         bsr     putstr
  2118.         move.l  (a5)+,d3
  2119.         mulu    #10,d3
  2120.         move.l  (a5)+,d0
  2121.         move.l  #100000,d1
  2122.         bsr     div
  2123.         add.l   d3,d0
  2124.         cmp.l   #2559,d0
  2125.         ble.s   9$
  2126.         move.l  #whatsthis,d0
  2127.         bsr     putstr
  2128.         bra.s   10$
  2129. 9$        moveq   #1,d6
  2130.         bsr     putfrac
  2131. 10$        move.b  #' ',d0
  2132.         bsr     putchar
  2133.         move.l  (a5)+,d0
  2134.         bsr     getaskname2
  2135.         bsr     newline
  2136.         bra.s   5$
  2137. 6$        rts
  2138.  
  2139. gettrq        CALL    Disable,_SysBase(PC)
  2140. 3$        move.l  0(a5),a5
  2141.         tst.l   0(a5)
  2142.         beq.s   4$
  2143.         move.l  a5,(a4)+
  2144.         move.w  d4,(a4)+
  2145.         move.l  32(a5),(a4)+
  2146.         move.l  36(a5),(a4)+
  2147.         move.l  14(a5),a1
  2148.         move.l  16(a1),(a4)+
  2149.         bra.s   3$
  2150. 4$        CALL    Enable,_SysBase(PC)
  2151.         rts
  2152.  
  2153.  
  2154. ;check if the timer is runnig, start it if not
  2155. starttimer  lea     timerio,a1
  2156.         cmp.b   #5,8(a1)
  2157.         beq.s   1$
  2158.         moveq   #0,d0
  2159.         move.b  timeout(PC),d0
  2160.         bne.s   2$
  2161.         tst.l   timeoutm
  2162.         beq.s   1$
  2163. 2$        move.l  d0,32(a1)
  2164.         move.l  timeoutm(PC),36(a1)
  2165.         move.w  #9,28(a1)
  2166.         CALL    SendIO,_SysBase(PC)
  2167. 1$        rts
  2168. ;Abort a timer request, if pending
  2169. stoptimer   lea     timerio,a1
  2170.         cmp.b   #5,8(a1)
  2171.         bne.s   1$
  2172.         CALL    AbortIO,_SysBase(PC)
  2173.         lea     timerio,a1
  2174.         CALL    WaitIO,_SysBase(PC)
  2175. 1$        move.w  timersig,d0
  2176.         moveq   #0,d1
  2177.         bset    d0,d1
  2178.         moveq   #0,d0
  2179.         CALL    SetSignal,_SysBase(PC)
  2180.         rts
  2181. ;Xoper main loop, process all incoming messages
  2182. processmsgs move.l  wnptr(PC),a0
  2183.         moveq   #0,d0
  2184.         move.w  intuisig(PC),d1
  2185.         bset    d1,d0
  2186.         move.w  timersig(PC),d1
  2187.         bset    d1,d0
  2188.         or.w    #4096,d0
  2189.         or.l    auxsig(PC),d0
  2190.         tst.l   auxsig
  2191.         bne.s   1$
  2192.         or.l    trapsignal(PC),d0
  2193. 1$        CALL    Wait,_SysBase(PC)
  2194.  
  2195.         move.l  d0,tasksigs
  2196.  
  2197.         move.l  trapsignal(PC),d1
  2198.         and.l   d0,d1
  2199.         beq.s   ctrl_c
  2200.         tst.b   gotguru
  2201.         bne.s   ctrl_c
  2202.         move.b  #1,gotguru
  2203.         bsr     showguru
  2204.         clr.b   gotguru
  2205.  
  2206. ctrl_c        moveq   #12,d1
  2207.         bsr     testsig
  2208.         bne     exit
  2209.  
  2210.  
  2211. timermsg    move.w  timersig(PC),d1
  2212.         bsr     testsig
  2213.         beq     intuimsgs
  2214.         tst.w   repeat
  2215.         bne.s   1$
  2216.         bsr     showwhat
  2217.         bra.s   intuimsgs
  2218. 1$        move.w  repeatlen,d0
  2219.         lea     repeatbuffer,a2
  2220.         lea     dummy,a1
  2221.         move.w  d0,d1
  2222. 2$        move.b  (a2)+,(a1)+
  2223.         dbf     d1,2$
  2224.         bsr     cli
  2225.         bsr     starttimer
  2226.  
  2227. intuimsgs   move.w  intuisig(PC),d1
  2228.         bsr     testsig
  2229.         beq     processnxtmsg
  2230. nextimsg    move.l  wnptr(PC),a0
  2231.         move.l  $56(a0),a0
  2232.         CALL    GetMsg,_SysBase(PC)
  2233.         tst.l   d0
  2234.         beq     processnxtmsg
  2235.         move.l  d0,intuimsg
  2236.  
  2237.         move.l  d0,a0
  2238.         move.l  20(a0),d0
  2239.  
  2240.         cmp.l   #$200,d0        ;CloseWindow
  2241.         bne.s   1$
  2242.         tst.b   addlines
  2243.         beq     exitall
  2244.         move.b  #1,cbreak
  2245.         bra     intuiend
  2246.  
  2247. 1$        cmp.l   #2,d0        ;ResizeWindow
  2248.         bne.s   2$
  2249.         bsr     setupscreen
  2250.         bra     intuiend
  2251.  
  2252. 2$        cmp.l   #4,d0        ;refresh
  2253.         bne.s   22$
  2254.         bsr     putiline
  2255.         bsr     blastout
  2256.         bsr     UpdateIArea
  2257.         bra     intuiend
  2258.  
  2259. 22$        tst.b   addlines
  2260.         bne     3$
  2261.         cmp.l   #$40,d0        ;gadgetup
  2262.         bne.s   3$
  2263.         tst.w   getanswer
  2264.         bne.s   3$
  2265.         bsr     replyintui
  2266.         bsr     stoptimer
  2267.         bra     instback
  2268.  
  2269. 3$        cmp.l   #$400,d0        ;RawKey
  2270.         bne     notarawkey
  2271.         move.w  #$80,d0
  2272.         and.w   24(a0),d0
  2273.         bne     intuiend
  2274.         and.w   #$7f,24(a0)
  2275.         lea     ievent,a1
  2276.         move.b  #1,4(a1)
  2277.         move.l  24(a0),6(a1)
  2278.         move.w  26(a0),qualifier
  2279.         move.l  a1,a0
  2280.         lea     outevent,a1
  2281.         moveq   #20,d1
  2282.         suba.l  a2,a2
  2283.         CALL    RawKeyConvert,condev(PC)
  2284.         tst.l   d0
  2285.         beq     intuiend
  2286.         lea     inputbuffer,a1
  2287.         lea     outevent,a2
  2288.         move.w  curpos(PC),d4
  2289.         moveq   #0,d3
  2290.         tst.b   addlines
  2291.         bne     197$
  2292.  
  2293.         sub.w   #1,cmdcompflag
  2294.  
  2295.         cmp.b   #$9b,0(a2)          ;CSI
  2296.         bne     110$
  2297.  
  2298.         cmp.b   #'?',1(a2)          ;help
  2299.         bne.s   399$
  2300.         tst.w   getanswer
  2301.         bne.s   399$
  2302.         bsr     stoptimer
  2303.         tst.w   bottomin
  2304.         bne.s   398$
  2305.         move.w  #1,bottomin
  2306.         clr.w   ibufferlen
  2307.         clr.w   curpos
  2308.         bsr     UpdateIArea
  2309. 398$        move.l  #usetxt,d0
  2310.         bsr     putnam
  2311.         clr.l   lastprinted
  2312.         bsr     blastout
  2313.         bra.s   420$
  2314.  
  2315. 399$        cmp.b   #'C',1(a2)          ;cursor right
  2316.         bne.s   400$
  2317.         cmp.w   ibufferlen(PC),d4
  2318.         bge.s   420$
  2319.         addq    #1,d4
  2320. 421$        move.w  d4,curpos
  2321. 420$        bra     100$
  2322.  
  2323. 400$        cmp.b   #'D',1(a2)          ;cursor left
  2324.         bne.s   401$
  2325.         subq    #1,d4
  2326.         bpl.s   421$
  2327.         bra.s   420$
  2328.  
  2329. 401$        cmp.b   #' ',1(a2)
  2330.         bne.s   402$
  2331.  
  2332.         cmp.b   #'@',2(a2)          ;shift right
  2333.         bne.s   403$
  2334.  
  2335. 404$        cmp.w   ibufferlen(PC),d4
  2336.         bge.s   421$
  2337.         addq    #1,d4
  2338.         cmp.b   #' ',0(a1,d4)
  2339.         bne.s   404$
  2340. 405$        cmp.w   ibufferlen(PC),d4
  2341.         bge.s   421$
  2342.         addq    #1,d4
  2343.         cmp.b   #' ',0(a1,d4)
  2344.         beq.s   405$
  2345.         bra.s   421$
  2346.  
  2347. 403$        cmp.b   #'A',2(a2)          ;shift left
  2348.         bne.s   420$
  2349. 406$        tst.w   d4
  2350.         beq.s   421$
  2351.         subq    #1,d4
  2352.         cmp.b   #' ',0(a1,d4)
  2353.         beq.s   406$
  2354. 407$        tst.w   d4
  2355.         beq.s   421$
  2356.         subq    #1,d4
  2357.         cmp.b   #' ',0(a1,d4)
  2358.         bne.s   407$
  2359.         addq    #1,d4
  2360.         bra.s   421$
  2361.  
  2362. 402$        cmp.b   #'A',1(a2)          ;cursor up
  2363.         bne.s   408$
  2364.         tst.w   bottomin
  2365.         bne.s   480$
  2366.         tst.w   curpos
  2367.         bne.s   480$
  2368.  
  2369.         clr.w   curpos
  2370.         clr.w   ibufferlen
  2371.         bsr     UpdateIArea
  2372.         bsr     clrcursor
  2373.         move.w  edline(PC),d3
  2374.         ext.l   d3
  2375.         tst.w   d3
  2376.         beq.s   481$
  2377.         subq    #1,d3
  2378.         cmp.l   firstline(PC),d3
  2379.         bge.s   481$
  2380.         move.l  d3,-(a7)
  2381.         subq.l  #1,firstline
  2382.         bsr     blastout
  2383.         move.l  (a7)+,d3
  2384. 481$        move.w  d3,edline
  2385.         bsr     getcurpos
  2386.         bsr     putcursor
  2387.         bra     intuiend
  2388. 480$        move.l  history(PC),a0
  2389.         tst.l   0(a0)
  2390.         beq.s   423$
  2391.         move.l  curhist(PC),a1
  2392.         cmp.l   a0,a1
  2393.         beq.s   409$
  2394.         move.l  4(a1),d0
  2395.         move.l  d0,curhist
  2396. 409$        move.l  a1,gothline
  2397.         bsr     copyhistory
  2398. 423$        bra     100$
  2399.  
  2400. 408$        cmp.b   #'B',1(a2)          ;cursor down
  2401.         bne     410$
  2402.         tst.w   bottomin
  2403.         bne.s   414$
  2404.         tst.w   curpos
  2405.         bne.s   414$
  2406.  
  2407.         clr.w   curpos
  2408.         clr.w   ibufferlen
  2409.         bsr     UpdateIArea
  2410.         bsr     clrcursor
  2411.         move.w  edline(PC),d3
  2412.         ext.l   d3
  2413.         move.l  numlines(PC),d4
  2414.         subq    #1,d4
  2415.         cmp.l   d4,d3
  2416.         beq.s   490$
  2417.         move.l  firstline(PC),d2
  2418.         add.w   rows(PC),d2
  2419.         subq    #1,d2
  2420.         addq    #1,d3
  2421.         cmp.w   d2,d3
  2422.         ble.s   490$
  2423.         move.l  d3,-(a7)
  2424.         addq.l  #1,firstline
  2425.         bsr     blastout
  2426.         move.l  (a7)+,d3
  2427. 490$        bra     481$
  2428. 414$        move.l  curhist(PC),d0
  2429.         beq.s   423$
  2430.         move.l  d0,a1
  2431.         move.l  0(a1),a1
  2432.         tst.l   0(a1)
  2433.         bne.s   411$
  2434.         clr.l   gothline
  2435.         clr.w   curpos
  2436.         clr.w   ibufferlen
  2437.         bra     423$
  2438. 411$        move.l  a1,curhist
  2439.         bra     409$
  2440.  
  2441. 410$        cmp.b   #'T',1(a2)          ;shift up
  2442.         bne.s   412$
  2443.         tst.w   hnum
  2444.         beq     423$
  2445.         move.l  history(PC),a1
  2446.         move.l  a1,curhist
  2447.         bra     409$
  2448.  
  2449. 412$        cmp.b   #'S',1(a2)          ;shift down
  2450.         bne.s   440$
  2451.         tst.w   hnum
  2452.         beq     423$
  2453.         move.l  history+8,curhist
  2454.         bra.s   414$
  2455.  
  2456. 440$        cmp.b   #'0',1(a2)          ;function keys
  2457.         bmi     423$
  2458.         cmp.b   #'9',1(a2)
  2459.         bgt     423$
  2460.         lea     1(a2),a0
  2461.         bsr     getnum
  2462.         lea     fkeys(PC),a0
  2463. 441$        move.l  0(a0),a0
  2464.         tst.l   0(a0)
  2465.         beq     100$
  2466.         cmp.b   8(a0),d2
  2467.         bne.s   441$
  2468.  
  2469.         move.b  9(a0),d5
  2470.         ext.w   d5
  2471.         subq    #1,d5
  2472.         lea     10(a0),a0
  2473.         move.w  curpos(PC),d4
  2474.         lea     inputbuffer,a2
  2475.         moveq   #0,d3
  2476.         lea     0(a2,d4),a2
  2477. 445$        move.b  (a0)+,d0
  2478.         cmp.b   #'^',d0
  2479.         bne.s   442$
  2480.         moveq   #1,d3
  2481.         bra.s   443$
  2482. 442$        cmp.b   #'_',d0
  2483.         bne.s   444$
  2484.         move.b  #' ',d0
  2485. 444$        move.b  d0,(a2)+
  2486.         addq    #1,d4
  2487. 443$        dbf     d5,445$
  2488.         move.w  d4,curpos
  2489.         cmp.w   ibufferlen(PC),d4
  2490.         ble.s   446$
  2491.         move.w  d4,ibufferlen
  2492. 446$        tst     d3
  2493.         beq     100$
  2494.         bra     got_fkey
  2495.  
  2496. 110$        moveq   #0,d3
  2497. 101$        move.w  curpos(PC),d4
  2498.         tst     d0
  2499.         beq     100$
  2500.         cmp.b   #13,0(a2,d3)        ;return
  2501.